#include <stdio.h>
#include <iostream>

using namespace std;

const int N = 30;

const int A = 1;
const int M = 13;
const int C = 3;
const int P = 6;

const int S = 2;
const int R = 3;



void printWynik (int* tablica, int n){
  for (int i = 0; i<n; i++){
    cout << tablica[i] << " ";
  }
    cout << "\n";
}

// --------------------------------------------------------------------------------

int*  genLiniowy (int x0, int n){
  int* wynik;
  wynik = new int [n];
  wynik[0] = x0;
  for ( int i =1 ; i<n ; i++){
    wynik[i] = (A * wynik[i-1] + C) % M;
  }
  return wynik;
}

// --------------------------------------------------------------------------------

int* genFibonacciego (int* tabLiniowa, int n) { 
  int* wynik;
  wynik = new int [n];
  for (int i=0 ; i<R ; i++){
    wynik[i] = tabLiniowa[i];
  }
  for (int i = R; i<n; i++){
    wynik[i]=( wynik[i-R] * wynik[i-S] ) % M;
  }
  return wynik;
}

// --------------------------------------------------------------------------------

int* genBBS (int* tabLiniowa, int n) {
  int* wynik;
  wynik = new int[n];
  wynik[0] = tabLiniowa[0];
  for (int i=1 ; i<n ; i++){
    wynik[i] = (wynik[i-1]*wynik[i-1]) %P;
  }
  
  printWynik(wynik,N);
  
  for (int i = 0 ; i<n ; i++){
    wynik[i] = wynik[i]%2;
  }
  return wynik;
}

// --------------------------------------------------------------------------------


int main(){

  int* resultLiniowy = genLiniowy (7,N);
  printWynik(resultLiniowy,N);
  int* resultFib = genFibonacciego (resultLiniowy,N);
  printWynik(resultFib,N);
  int* resultBBS = genBBS(resultLiniowy,N);
  printWynik(resultBBS,N);
  return 0;
  
}